#include "esp_task_wdt.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "../components/fatfs/ff.h"
#include "../components/music/include/music.h"
#include "../components/sdcard/include/spi_sdcard.h"


/* 逻辑磁盘工作区(在调用任何 FATFS 相关函数之前,必须先给 fs 申请内存) */
FATFS fs[FF_VOLUMES];

/*获取SD卡容量*/
uint8_t exfuns_get_free(char *pdrv, int *total, int *free);


void app_main(void)
{
    printf("10秒后开始运行程序\r\n");
    vTaskDelay(10000);
    // 临时禁用看门狗
    esp_task_wdt_deinit();
    printf("app_main()程序开始\r\n");

    while (sd_init())   /* 检测不到SD卡 */
    {
        printf("SD Card Error!\r\n");
       vTaskDelay(500);
    }

    /* 检测SD卡成功 */
    uint32_t sd_size;
    sd_size = sd_get_sector_count();  /* 得到扇区数 */
    printf("SD Card OK, SD Card Size:   %lf MB\r\n", sd_size * 512.0 / 1024 / 1024);
    printf("SD Card OK, SD Card Size:   %ld MB\r\n", sd_size >> 11);//sd_size * 2^9 / 2^10 / 2^10
   
    /* 挂载 SD 卡, 0: 表示盘符， 1 表示立即挂载 */
    int res = f_mount(&(fs[0]), "0:", 1);
    if(res == FR_OK)
    {
        printf("\r\n\r\n=============挂载成功=================\r\n\r\n");
        /*只读模式不能用下面*/
        // int total;
        // int free;
        // exfuns_get_free("0:", &total, &free);
        // printf("total %d KB, free %d KB\r\n", total, free);
    } 
    else
    {
        printf("挂载失败 原因：%d\r\n", res);
        return ;
    }

    Play_music("0:/meng.wav");
}


/**
 * @brief       获取磁盘剩余容量
 * @param       pdrv : 磁盘编号("0:"~"9:")
 * @param       total: 总容量 (KB)
 * @param       free : 剩余容量 (KB)
 * @retval      0, 正常; 其他, 错误代码
 */
uint8_t exfuns_get_free(char *pdrv, int *total, int *free)
{
    FATFS *fs1;
    uint8_t res;
    uint32_t fre_clust = 0, fre_sect = 0, tot_sect = 0;
    
    /* 得到磁盘信息及空闲簇数量 */
    res = (uint32_t)f_getfree((const TCHAR *)pdrv, (DWORD *)&fre_clust, &fs1);

    if (res == 0)
    {
        tot_sect = (fs1->n_fatent - 2) * fs1->csize;    /* 得到总扇区数 */
        fre_sect = fre_clust * fs1->csize;              /* 得到空闲扇区数 */
#if FF_MAX_SS!=512  /* 扇区大小不是512字节,则转换为512字节 */
        tot_sect *= fs1->ssize / 512;
        fre_sect *= fs1->ssize / 512;
#endif
        *total = tot_sect >> 1;     /* 单位为KB */
        *free = fre_sect >> 1;      /* 单位为KB */
    }

    return res;
}